file_path = r'dataset.txt'


def read_data(path)->list:
    """
    读取并预处理用于训练的数据
    :param path: 数据文件路径
    :return: 每一行数据列表
    """
    lines_data = list()
    with open(path, 'r', encoding='utf8') as f:
        for line in f.readlines()[1::]:  # 去掉第一行
            # 将数据处理为：['1', '青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是']
            lines_data.append(line.rstrip('\n').rstrip().split(','))
    return lines_data


def group_column(lines: list, index: int)->dict:
    """
    将一列中的数据聚合统计为{值1:数量,值2:数量...}
    :param lines: 数据
    :param index: 列编号
    :return:  返回数据样例：{'蜷缩': 7, '稍蜷': 6, '硬挺': 1}
    """
    res = dict()
    for line in lines:
        if line[index] in res.keys():
            res[line[index]] += 1
        else:
            res[line[index]] = 0
    return res


def column_percentage(lines: list, index: int)->dict:
    """
    计算数据中一个列的值的占比
    :param lines: 数据
    :param index: 列编号
    :return:
    """
    res = dict()
    group_data = group_column(lines, index)
    total = sum(group_data.values())
    for k, v in group_data.items():
        res[k] = v / total
    return res


def get_percentage(lines: list, index, value)->float:
    """
    获取一个属性的值在数据中的比例
    :param lines: 数据
    :param index: 属性
    :param value: 值
    :return: 百分比
    """
    return column_percentage(lines, index).get(value, 1)  # 没有对应概率的情况返回1


def consule_input()->list:
    """
    获取输入
    :return:
    """
    res = list()
    res.append(input('请输入色泽（青绿、乌黑、浅白）：'))
    res.append(input('请输入根蒂（蜷缩、稍蜷、硬挺）：'))
    res.append(input('请输入敲声（浊响、沉闷、清脆）：'))
    res.append(input('请输入纹理（清晰、稍糊、模糊）：'))
    res.append(input('请输入脐部（凹陷、稍凹、平坦）：'))
    res.append(input('请输入触感（硬滑、软粘）：'))
    return res


if __name__ == '__main__':
    lines = read_data(file_path)
    input_list = consule_input()
    good_melon_per = get_percentage(lines, 7, '是')  # 好瓜率
    bad_melon_per = get_percentage(lines, 7, '否')  # 坏瓜率
    column_count = 1
    for input_choice in input_list:
        good_melon_per *= get_percentage([i for i in lines if i[7] == '是'], column_count, input_choice)
        bad_melon_per *= get_percentage([i for i in lines if i[7] == '否'], column_count, input_choice)
        column_count += 1
    print('好瓜率：{}'.format(good_melon_per))
    print('坏瓜率：{}'.format(bad_melon_per))
    print('结果：是') if good_melon_per > bad_melon_per else print('结果：否')
